package server

import (
	"ZK306/common/dao"
	"ZK306/common/inits"
	"ZK306/common/proto/user"
	"ZK306/pkg"
	"context"
	"errors"
	"math/rand"
	"strconv"
	"time"
)

const SMS_KEY = "sms-login"
const INCR_KEY = "mobile"
const TIME_KEY = "time"

func UserLogin(in *user.UserLoginRequest) (*user.UserLoginResponse, error) {
	//获取短信验证码
	get := inits.Rdb.Get(context.Background(), SMS_KEY+in.Mobile)
	//查看账号是否存在
	info, _ := dao.GetUserInfo(in.Mobile)
	if info == nil {
		//不存在自动注册
		create := dao.UserCreate(in.Mobile)
		if !create {
			return nil, errors.New("用户自动注册失败")
		}
		if get.Val() != in.Sms {
			return nil, errors.New("验证码输入错误,请重新输入")
		}
	} else {
		//判断验证码
		if get.Val() != in.Sms {
			return nil, errors.New("验证码输入错误,请重新输入")
		}
	}
	//登陆成功删除缓存验证码
	inits.Rdb.Del(context.Background(), SMS_KEY+in.Mobile)
	return &user.UserLoginResponse{UserId: int64(info.ID)}, nil
}

func UserSms(in *user.UserSmsRequest) (*user.UserSmsResponse, error) {
	//获取每次自增++后的总次数
	get, _ := inits.Rdb.Get(context.Background(), INCR_KEY+in.Mobile).Int()

	//判断存入一小时的缓存是否存在,不存在则清除手机号码累计发送次数
	set := inits.Rdb.Get(context.Background(), TIME_KEY)

	if get >= 3 {
		//存储一个一小时的缓存
		inits.Rdb.Set(context.Background(), TIME_KEY, 1, time.Hour*1)
		return nil, errors.New("当前手机号发送验证码大于3次,请一小时后再试")
	}

	code := rand.Intn(9000) + 1000

	//手机号码格式验证
	if len(in.Mobile) != 11 {
		return nil, errors.New("手机号码为十一位")
	}

	if in.Mobile[0] != 1 {
		return nil, errors.New("手机号码为1开头")
	}
	//发送验证码
	sms, _ := pkg.Sms(in.Mobile, strconv.Itoa(code))

	if *sms.Body.Code != "OK" {
		return nil, errors.New(*sms.Body.Message)
	}
	//验证码发送成功存入缓存3分钟
	inits.Rdb.Set(context.Background(), SMS_KEY+in.Mobile, code, time.Minute*3)
	//为每次发送验证码的手机号自增加1次
	inits.Rdb.IncrBy(context.Background(), INCR_KEY+in.Mobile, 1)

	if set.Val() == "" {
		inits.Rdb.Del(context.Background(), INCR_KEY+in.Mobile)
	}
	return &user.UserSmsResponse{Success: true}, nil
}
